#include "c/spi.h"

#include <avr/io.h>

#define SPI_PORTx PORTB
#define SPI_DDRx DDRB
#define SPI_MOSI_PIN 3
#define SPI_MISO_PIN 4
#define SPI_SCK_PIN 5
#define SPI_SS_PIN 2

void spi_init()
{
	// setup pins
	SPI_DDRx |= _BV(SPI_MOSI_PIN) | _BV(SPI_SCK_PIN) | _BV(SPI_SS_PIN);
	SPI_DDRx &= ~_BV(SPI_MISO_PIN);
	
	// spi master mode, fastest possible
	SPCR = _BV(SPE) | _BV(MSTR);
	SPSR = 1;
}

uint8_t spi_tx(uint8_t x)
{
	SPDR = x;
	loop_until_bit_is_set(SPSR, SPIF);
	return SPDR;
}

// mode 0 = LCD
// mode 1 = thermocouple IC
void spi_mode(uint8_t x)
{
	loop_until_bit_is_set(SPSR, SPIF);
	
	if (x == SPI_MODE_LCD)
	{
		SPCR |= _BV(CPHA);
		SPCR |= _BV(CPOL);
		SPSR |= _BV(SPI2X);
		
		spi_tx(0);
	}
	else if (x == SPI_MODE_TCIC)
	{
		SPCR |= _BV(CPHA);
		SPCR &= ~_BV(CPOL);
		SPSR &= ~_BV(SPI2X);
		
		spi_tx(0);
	}
	
	loop_until_bit_is_set(SPSR, SPIF);
}